/**
 * 用户相关API
 * 对应后端UserRouter.js中的路由
 */
import api from './axios';

/**
 * 用户接口
 */
export interface User {
  _id?: string;           // MongoDB ID
  id?: string | number;   // 前端ID
  username: string;       // 用户名
  password?: string;      // 密码(仅创建用户时使用)
  roleId: number | string; // 角色ID
  role?: {               // 角色信息
    _id?: string;         // 角色ID
    roleName: string;     // 角色名称
    roleType?: number;    // 角色类型
    rights?: string[];    // 权限列表
  };
  roleState: boolean;     // 用户状态(启用/禁用)
  default?: boolean;      // 是否默认用户
  region?: string | number; // 所属区域ID
  avatar?: string;        // 头像URL
  email?: string;         // 邮箱
  createTime?: number;    // 创建时间戳
}

/**
 * 获取当前用户个人资料
 * 对应后端GET /adminapi/users/profile路由
 */
export const getUserProfile = async () => {
  try {
    const response = await api.get('/users/profile');
    
    if (response.data && response.data.code === 200 && response.data.data) {
      return response.data.data;
    } else {
      throw new Error(response.data.msg || '获取个人资料失败');
    }
  } catch (error) {
    console.error('获取个人资料失败:', error);
    throw error;
  }
};

/**
 * 上传用户头像
 * 对应后端POST /adminapi/users/avatar路由
 */
export const uploadAvatar = async (formData: FormData | File) => {
  try {
    // 创建FormData对象
    let dataToSend: FormData;
    
    // 如果传入的是File类型，则需要创建新的FormData
    if (formData instanceof File) {
      dataToSend = new FormData();
      dataToSend.append('file', formData);
    } else {
      // 如果已经是FormData，直接使用
      dataToSend = formData;
    }
    
    const response = await api.post('/users/avatar', dataToSend, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    });
    
    // 打印完整响应，用于调试
    console.log('上传头像/更新信息响应:', response.data);
    
    if (response.data && response.data.code === 200 && response.data.data) {
      // 确保响应中包含有效的数据
      const userData = response.data.data;
      console.log('上传头像成功，返回数据:', userData);
      
      // 如果返回的头像URL是相对路径，不要修改它，让前端getAvatarUrl函数处理
      return userData;
    } else if (response.data && response.data.code === 200) {
      // 处理后端返回成功但没有data的情况
      return true;
    } else {
      // 仅在确实有错误消息时抛出错误
      if (response.data && response.data.msg) {
        throw new Error(response.data.msg);
      } else {
        // 避免显示通用错误
        return true; 
      }
    }
  } catch (error) {
    console.error('上传头像/更新信息失败:', error);
    // 重新抛出错误，但避免在控制台显示
    if (error instanceof Error && error.message !== 'Network Error') {
    throw error;
    } else {
      // 对于网络错误，返回null而不是抛出错误
      return null;
    }
  }
};

/**
 * 修改用户密码
 * 对应后端PATCH /adminapi/users/password路由
 */
export const changePassword = async (oldPassword: string, newPassword: string) => {
  try {
    const response = await api.patch('/users/password', {
      oldPassword,
      newPassword
    });
    
    return response.data;
  } catch (error) {
    console.error('修改密码失败:', error);
    throw error;
  }
};

/**
 * 获取用户列表
 * 对应后端GET /adminapi/users路由
 */
export const getUserList = async () => {
  try {
    const response = await api.get('/users');
    
    if (response.data && response.data.code === 200 && response.data.data) {
      return response.data.data;
    } else {
      return [];
    }
  } catch (error) {
    console.error('获取用户列表失败:', error);
    return [];
  }
};

/**
 * 获取单个用户详情
 * 对应后端GET /adminapi/users/:id/detail路由
 */
export const getUserById = async (id: string | number) => {
  try {
    const response = await api.get(`/users/${id}/detail`);
    
    if (response.data && response.data.code === 200 && response.data.data) {
      return response.data.data;
    } else {
      return null;
    }
  } catch (error) {
    console.error(`获取用户详情失败(ID=${id}):`, error);
    return null;
  }
};

/**
 * 添加用户
 * 对应后端POST /adminapi/users路由
 */
export const addUser = async (data: Partial<User>) => {
  try {
    // 直接发送请求，使用axios.ts中设置的30秒超时
    const response = await api.post('/users', data);
    return response.data;
  } catch (error) {
    console.error('添加用户失败:', error);
    
    // 简化错误处理，直接向上传播错误
    let errorMsg = '添加用户失败';
    
    if (error instanceof Error) {
      // 提取并传递错误信息
      errorMsg = error.message || errorMsg;
    }
    
    throw new Error(errorMsg);
  }
};

/**
 * 更新用户信息
 * 对应后端PUT /adminapi/users/:id路由
 */
export const updateUser = async (id: string | number, data: Partial<User>) => {
  try {
    // 删除id和_id字段，避免造成冲突
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    const { id: _, _id: __, ...updateData } = data;
    
    const response = await api.put(`/users/${id}`, updateData);
    return response.data;
  } catch (error) {
    console.error(`更新用户失败(ID=${id}):`, error);
    throw error;
  }
};

/**
 * 部分更新用户信息
 * 对应后端PATCH /adminapi/users/:id路由
 */
export const patchUser = async (id: string | number, data: Partial<User>) => {
  try {
    // 删除id和_id字段，避免造成冲突
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    const { id: _, _id: __, ...updateData } = data;
    
    const response = await api.patch(`/users/${id}`, updateData);
    return response.data;
  } catch (error) {
    console.error(`部分更新用户失败(ID=${id}):`, error);
    throw error;
  }
};

/**
 * 更新用户状态(启用/禁用)
 * 对应后端PATCH /adminapi/users/:id/state路由
 */
export const updateUserState = async (id: string | number, roleState: boolean) => {
  try {
    const response = await api.patch(`/users/${id}/state`, { roleState });
    return response.data;
  } catch (error) {
    console.error(`更新用户状态失败(ID=${id}):`, error);
    throw error;
  }
};

/**
 * 删除用户
 * 对应后端DELETE /adminapi/users/:id路由
 */
export const deleteUser = async (id: string | number) => {
  try {
    const response = await api.delete(`/users/${id}`);
    return response.data;
  } catch (error) {
    console.error(`删除用户失败(ID=${id}):`, error);
    throw error;
  }
};

export default {
  getUserProfile,
  uploadAvatar,
  changePassword,
  getUserList,
  getUserById,
  addUser,
  updateUser,
  patchUser,
  updateUserState,
  deleteUser
}; 